
import { reactive } from 'vue'
import type { IFormItem, IFormItemList } from '../../types/20-form-item'

// 动态创建表单的 model
type FormModel = {
  [key: string | number]: any
}

// 一个控件对应多字段的时候，拆分字段做默认值
const moreColName = (m: IFormItem, formModel: FormModel, defVal = []) => {
  const arr = m.colName.split('_')
  if (arr.length === 1) {
    // 不是多字段
    formModel[m.colName] = defVal
  } else {
    // 多字段，拆分设置默认值
    arr.forEach((col: string) => {
      formModel[col] = ''
    })
  }
}

/**
 * @function 创建表单的 v-model
 * @description 依据表单的 meta，自动创建 model
 * @param meta 表单子控件的meta
 * @param colOrder 需要哪些字段，以及顺序
 */
const createModel = (meta: IFormItemList, colOrder: Array<number | string>) => {
  const formModel = reactive<FormModel>({})

  // 依据 meta，创建 model
  // for(const key in meta) {
  colOrder.forEach(key => {
    const m: IFormItem = meta[key]
    // 根据控件类型设置属性值
    switch (m.controlType) {
      case 1: // slot扩展的子控件
      case 100: // 文本类
      case 101:
      case 102:
      case 103:
      case 104:
      case 105:
      case 106:
      case 107:
      case 108: // 颜色
      case 140: // 上传
      case 141: // 上传
      case 142: // 上传
        formModel[m.colName] = ''
        break
      case 110: // 数字
      case 111:
      case 112:
        formModel[m.colName] = 0
        break
      case 120: // 日期
      case 121: // 日期时间
      case 122: // 年月
      case 124: // 年
      case 123: // 年周
        formModel[m.colName] = ''
        break
      case 125: // 日期范围
      case 126:
      case 127:
      case 128:
        moreColName(m , formModel)
        break
      case 130: // 任意时间
      case 132: // 选择时间
        formModel[m.colName] = ''
        break
      case 131: // 时间范围
      case 133: // 时间范围
        moreColName(m , formModel)
        break
     
      case 150: // 勾选
      case 151: // 开关
        formModel[m.colName] = false
        break
      case 152: // 多选组
        formModel[m.colName] = []
        break
      case 153: // 单选组
      case 160: // 下拉单选
      case 162: // 分组下拉单选
      case 165: // 树状下拉
        formModel[m.colName] = null
        break
      case 161: // 下拉多选
      case 163: // 分组下拉多选
      case 166: // 树状多选
        formModel[m.colName] = []
        break

      case 164: // 下拉联动
        moreColName(m , formModel)
        break
      case 170: // 备选项
        moreColName(m , formModel)
        break
      default:
        // 扩展的子控件
        moreColName(m , formModel)
        break
    }

    // 看看有没有设置默认值
    if (typeof m.defValue !== 'undefined' && m.controlType !== 162) {
      switch (m.defValue) {
        case '':
          break
        case '{}':
          formModel[m.colName] = {}
          break
        case '[]':
          formModel[m.colName] = []
          break
        case '{{now}}':
          formModel[m.colName] = new Date()
          break
        default:
          formModel[m.colName] = m.defValue
          break
      }
    }
  })
  return formModel
}

/**
 * 把meta的id的key 改成字段名作为key
 * @param meta 表单子控件的meta
 * @returns
 */
const toChildMeta = (meta: IFormItemList) => {
  const childMeta = {}

  for (const key in meta) {
    const m = meta[key]
    childMeta[m.colName] = meta[key]
  }

  return childMeta
}

export {
  createModel,
  toChildMeta
}